home *** CD-ROM | disk | FTP | other *** search
- /*
- % VFFT .C
- % Virtual-Very Fast Fourier Transform
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- This software is copyright (C) by the Lawrence Berkeley Laboratory.
- Permission is granted to reproduce this software for non-commercial
- purposes provided that this notice is left intact.
-
- It is acknowledged that the U.S. Government has rights to this software
- under Contract DE-AC03-765F00098 between the U.S. Department of Energy
- and the University of California.
-
- This software is provided as a professional and academic contribution
- for joint exchange. Thus, it is experimental, and is provided ``as is'',
- with no warranties of any kind whatsoever, no support, no promise of
- updates, or printed documentation. By using this software, you
- acknowledge that the Lawrence Berkeley Laboratory and Regents of the
- University of California shall have no liability with respect to the
- infringement of other copyrights by any part of this software.
-
- For further information about this notice, contact William Johnston,
- Bld. 50B, Rm. 2239, Lawrence Berkeley Laboratory, Berkeley, CA, 94720.
- (wejohnston@lbl.gov)
-
- For further information about this software, contact:
- Jin Guojun
- Bld. 50B, Rm. 2275, Lawrence Berkeley Laboratory, Berkeley, CA, 94720.
- g_jin@lbl.gov
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Every block has its own write_header() before its processing.
- %
- % AUTHOR: Guojun Jin - LBL 5/10/91
- */
- char usage[]="options:\n\
- vfft [-double] [-D2] [-VV] [<] image [> VFFT]\n\
- \n\
- -double output double VFFT \n\
- -D2 2-dimension VFFT \n\
- -VV real and imaginary are in separated planes \n";
-
-
- #include "complex.h"
- #include "header.def"
- #include "imagedef.h"
-
- U_IMAGE uimg;
-
- MType dimen1len, dimen2size, fsize, vsize;
-
- #define row uimg.height
- #define cln uimg.width
- #define frm uimg.frames
-
-
- main(argc, argv)
- int argc;
- char* argv[];
- {
- bool dflag=0, dimens=0, vflag=0;
- int i, j, f, hrows, hcols, logfrms, logrows, logcols;
-
- format_init(&uimg, IMAGE_INIT_TYPE, HIPS, -1, *argv, "S20-1");
-
- for (i=1;i<argc;i++){
- if (argv[i][0]=='-'){
- switch(argv[i][1]) {
- case 'd':
- dflag++; break;
- case 'D':
- dimens++; break;
- case 'V':
- vflag++; break;
- default:
- errout: usage_n_options(usage, i, argv[i]);
- }
- }
- else if ((in_fp=freopen(argv[i], "r", stdin)) == NULL)
- syserr("can't open %s as input", argv[i]);
- }
-
- io_test(fileno(in_fp), goto errout);
-
- (*uimg.header_handle)(HEADER_READ, &uimg, 0, 0);
-
- if (uimg.in_form==IFMT_DOUBLE || uimg.in_form==IFMT_DBLCOM)
- dflag++;
- if (uimg.in_form > IFMT_DBLCOM || uimg.in_form==IFMT_ASCII)
- syserr("undesired input image format");
-
- if (frm < 2) {
- vflag = 0;
- dimens = 1;
- }
- if (vflag) dimens=0;
- fsize = row * cln;
- hrows = row >> 1;
- hcols = cln >> 1;
- dimen1len = hcols + 1;
- vsize = row * dimen1len;
-
- logfrms=logrows=logcols= -1;
- for (i=0,j=1;i<12;i++,j+=j) {
- if (j==row) logrows=i;
- if (j==cln) logcols=i;
- if (j==frm) logfrms=i;
- }
-
- if (logfrms == -1 || logrows == -1 || logcols == -1){
- mesg("be patient for non power of 2 processing\n");
- #include "realvfft.cxx"
- exit(0);
- }
-
- w_init(MAX(MAX(hrows, hcols), 1<<logfrms-1));
- if (dflag){
- double *temp,
- *re_i = (double*)nzalloc(fsize, sizeof(*re_i)<<1, "ibuf"),
- *im_i = re_i + fsize,
- *re_o, *im_o, *cvt;
-
- if (!dimens){
- re_o = (double*)nzalloc(frm*vsize, sizeof(*re_o)<<1, "obuf"),
- im_o = re_o + frm*vsize;
- cvt = re_i;
- }
- else cvt = (double*)nzalloc(fsize, sizeof(*cvt)<<1, "cvt");
-
- if (vflag)
- uimg.o_form = IFMT_DVVFFT3D;
- else uimg.o_form = IFMT_DVFFT3D + dimens;
- uimg.pxl_out=16;
- (*uimg.header_handle)(HEADER_WRITE, &uimg, argc, argv, True);
-
- for (f=0; f<frm; f++){
- if (uimg.in_form == IFMT_DOUBLE)
- temp = re_i;
- else temp = im_i;
- upread(temp, uimg.pxl_in, fsize, in_fp);
- switch(uimg.in_form){
- case IFMT_BYTE: btod(im_i, re_i, fsize);
- break;
- case IFMT_SHORT: stod(im_i, re_i, fsize);
- break;
- case IFMT_LONG: itod(im_i, re_i, fsize);
- break;
- case IFMT_FLOAT: ftod(im_i, re_i, fsize);
- }
- for (i=0; i<fsize; i++)
- im_i[i] = 0.;
-
- dvfft_2d(re_i, im_i, logrows, logcols);
-
- if (dimens){
- register double *re_in = re_i, *im_in = im_i;
- temp = cvt;
- for (i=0; i<row; i++){
- for (j=0; j<dimen1len; j++){
- *temp++ = *re_in++;
- *temp++ = *im_in++;
- }
- re_in += cln - dimen1len;
- im_in += cln - dimen1len;
- }
- fwrite(cvt, sizeof(*cvt)<<1, vsize, out_fp);
- }
- else {
- register double *re_c = re_o + f*vsize,
- *im_c = im_o + f*vsize,
- *re_in = re_i, *im_in = im_i;
- for (i=0; i<row; i++){
- for (j=0; j<dimen1len; j++){
- *re_c++ = *re_in++;
- *im_c++ = *im_in++;
- }
- re_in += hcols-1;
- im_in += hcols-1;
- }
- }
- }
- if (!dimens){
- w_load(1<<logfrms);
- for (i=0; i<vsize; i++)
- dvfftn(re_o+i, im_o+i, logfrms, vsize);
- if (vflag)
- for (f=0; f<frm; f++){
- fwrite(re_o+f*vsize, sizeof(*re_o), vsize, out_fp);
- fwrite(im_o+f*vsize, sizeof(*im_o), vsize, out_fp);
- }
- else{
- register double *fop,
- *re_c = re_o,
- *im_c = im_o;
- for (f=0; f<frm; f++){
- for (i=vsize, fop=cvt; i--;){
- *fop++ = *re_c++;
- *fop++ = *im_c++;
- }
- i = fwrite(cvt, sizeof(*cvt)<<1, vsize, out_fp);
- if (i != vsize)
- syserr("f%d [%d] write %d", f, vsize, i);
- }
- }
- }
- }
- else {
- float *temp,
- *re_i = (float*)nzalloc(fsize, sizeof(*re_i)<<1, "ibuf"),
- *im_i = re_i + fsize,
- *re_o, *im_o, *cvt;
-
- if (!dimens){
- re_o = (float*)nzalloc(frm*vsize, sizeof(*re_o)<<1, "obuf"),
- im_o = re_o + frm*vsize;
- cvt = re_i;
- }
- else cvt = (float*)nzalloc(fsize, sizeof(*cvt)<<1, "cvt");
-
- if (vflag)
- uimg.o_form = IFMT_VVFFT3D;
- else uimg.o_form = IFMT_VFFT3D + dimens;
- uimg.pxl_out = 8;
- (*uimg.header_handle)(HEADER_WRITE, &uimg, argc, argv, True);
-
- for (f=0; f<frm; f++){
- if (uimg.in_form == IFMT_FLOAT)
- temp = re_i;
- else temp = im_i;
- upread(temp, uimg.pxl_in, fsize, in_fp);
- switch(uimg.in_form){
- case IFMT_BYTE: btof(im_i, re_i, fsize);
- break;
- case IFMT_SHORT: stof(im_i, re_i, fsize);
- break;
- case IFMT_LONG: itof(im_i, re_i, fsize);
- break;
- }
- for (i=0; i<fsize; i++)
- im_i[i] = 0.;
-
- vfft_2d(re_i, im_i, logrows, logcols);
-
- if (dimens){
- register float *re_in = re_i, *im_in = im_i;
- temp = cvt;
- for (i=0; i<row; i++){
- for (j=0; j<dimen1len; j++){
- *temp++ = *re_in++;
- *temp++ = *im_in++;
- }
- re_in += cln - dimen1len;
- im_in += cln - dimen1len;
- }
- fwrite(cvt, sizeof(*cvt)<<1, vsize, out_fp);
- }
- else {
- register float *re_c = re_o + f*vsize,
- *im_c = im_o + f*vsize,
- *re_in = re_i, *im_in = im_i;
- for (i=0; i<row; i++){
- for (j=0; j<dimen1len; j++){
- *re_c++ = *re_in++;
- *im_c++ = *im_in++;
- }
- re_in += hcols-1;
- im_in += hcols-1;
- }
- }
- }
- if (!dimens){
- w_load(1<<logfrms);
- for (i=0; i<vsize; i++)
- vfftn(re_o+i, im_o+i, logfrms, vsize);
- if (vflag)
- for (f=0; f<frm; f++){
- fwrite(re_o+f*vsize, sizeof(*re_o), vsize, out_fp);
- fwrite(im_o+f*vsize, sizeof(*im_o), vsize, out_fp);
- }
- else{
- register float *fop,
- *re_c = re_o,
- *im_c = im_o;
- for (f=0; f<frm; f++){
- for (i=vsize, fop=cvt; i--;){
- *fop++ = *re_c++;
- *fop++ = *im_c++;
- }
- i = fwrite(cvt, sizeof(*cvt)<<1, vsize, out_fp);
- if (i != vsize)
- syserr("f%d [%d] write %d", f, vsize, i);
- }
- }
- }
- }
- }
-
- btof(ibp, obp, n)
- register byte* ibp;
- register float *obp;
- register int n;
- {
- register int i;
- for (i=0; i<n; i++) *obp++ = *ibp++;
- }
-
- stof(ibp, obp, n)
- register unsigned short *ibp;
- register float *obp;
- register int n;
- {
- register int i;
- #ifdef _DEBUG_
- message("%d short to float\n", n);
- #endif
- for (i=0; i<n; i++) *obp++ = *ibp++;
- }
-
- itof(ibp, obp, n)
- register int* ibp, n;
- register float* obp;
- {
- register int i;
- #ifdef _DEBUG_
- message("%d itof\n", n);
- #endif
- for (i=0; i<n; i++) *obp++ = *ibp++;
- }
-
- btod(ibp, obp, n)
- register byte* ibp;
- register double *obp;
- register int n;
- {
- register int i;
- for (i=0; i<n; i++) *obp++ = *ibp++;
- }
-
- stod(ibp, obp, n)
- register unsigned short *ibp;
- register double *obp;
- register int n;
- {
- register int i;
- #ifdef _DEBUG_
- message("%d short to double\n", n);
- #endif
- for (i=0; i<n; i++) *obp++ = *ibp++;
- }
-
- itod(ibp, obp, n)
- register int* ibp, n;
- register double *obp;
- {
- register int i;
- #ifdef _DEBUG_
- message("%d itod\n", n);
- #endif
- for (i=0; i<n; i++) *obp++ = *ibp++;
- }
-
- ftod(ibp, obp, n)
- register float* ibp;
- register double *obp;
- register int n;
- {
- register int i;
- #ifdef _DEBUG_
- message("%d FtoD\n", n);
- #endif
- for (i=0; i<n; i++) *obp++ = *ibp++;
- }
-